home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
cdst
/
cdst.c
next >
Wrap
C/C++ Source or Header
|
1993-07-08
|
3KB
|
134 lines
#include <stdio.h>
#include <stdio.h>
#define abs(x) ( (x) > 0 ? (x) : -(x) )
#define tosec(x) ( ( x.min ) * 60 + ( x.sec ) )
int info( void ) ;
void sort( void ) ;
void sort_loop( void ) ;
typedef struct
{
unsigned char min ;
unsigned char sec ;
unsigned char frame ;
} CDTIME ;
int buff[40], sec[40], count[40] ;
int combi, loop, song, half_song, min_sec ;
void main( void )
{
int i, j, k ;
printf( "CDを準備してください\n" ) ;
printf( "用意が出来たらリターンを入力してください。\n" ) ;
while( getchar( ), ( song = info( ) ) == 0 )
{
printf( "CDの準備ができてません。\n" ) ;
printf( "もう一度確認してリターンを入力してください。\n" ) ;
}
printf( "このCDには %d 曲入ってます。\n",song ) ;
printf( "ソートを開始します。\n\n" ) ;
sort( ) ;
printf( "A面\n" ) ;
for( k = 0, i = 1 ; i <= buff[0] ; i++ )
{
printf( "track:%2d---time:%2d'%2d\x22\n",
buff[i], sec[buff[i]]/60, sec[buff[i]]%60 ) ;
k += sec[buff[i]] ;
}
printf( " total time:%2d'%2d\x22\n\n", k/60, k%60 ) ;
printf( "B面\n" ) ;
for( k = 0, i = j = 1 ; i <= song ; i++ )
{
if( i == buff[j] )
j++ ;
else
{
printf( "track:%2d---time:%2d'%2d\x22\n",
i, sec[i]/60, sec[i]%60 ) ;
k += sec[i] ;
}
}
printf( " total time:%2d'%2d\x22\n\n", k/60, k%60 ) ;
}
int info( void )
{
int cdtype, starttrack, endtrack, i, j, dummy[40] ;
CDTIME track[100], disc ;
for( j = 0 ; j <= 255 ; j++ )
{
i = cdr_cdinfo( 0, &cdtype, &starttrack, &endtrack, track, &disc ) ;
if( i == 0 )
break ;
}
if( i != 0 )
return( 0 ) ;
track[endtrack].min = disc.min;
track[endtrack].sec = disc.sec;
track[endtrack].frame = disc.frame;
if( --track[endtrack].frame < 0 )
{
track[endtrack].frame = 74 ;
if( --track[endtrack].sec < 0 )
{
track[endtrack].sec = 59 ;
--track[endtrack].frame ;
}
}
for( i = j = 1 ; i <= endtrack ; i++ )
if( ( track[i-1].min & 0x80 ) == 0 )
{
sec[j] = tosec( track[i] ) - tosec( track[i-1] ) ;
j++ ;
}
return( j - 1 ) ;
}
void sort( void )
{
int i ;
for( *sec = 0, i = 1 ; i <= song ; i++ )
*sec += sec[i] ;
half_song = ( song >> 1 ) ;
count[0] = 0 ;
loop = 0 ;
min_sec = *sec ;
for( combi = half_song ; combi >= 1 ; combi-- )
{
sort_loop( ) ;
printf( "%02d ", combi ) ;
}
printf( "\n\n" ) ;
}
void sort_loop( void )
{
int i, j ;
if( loop != combi )
{
loop++ ;
for( count[loop] = count[loop-1] + 1 ;
count[loop] <= song - combi + loop ; count[loop]++ )
sort_loop( ) ;
loop-- ;
}
else
{
for( j = 0, i = 1 ; i <= combi ; i++ )
j += sec[count[i]] ;
if( abs( *sec - 2 * j ) < min_sec )
{
for( i = 1 ; i <= combi ; i++ )
buff[i] = count[i] ;
buff[0] = combi ;
min_sec = abs( *sec - 2 * j ) ;
}
}
}